/**
 * 
 */
package uno.utilities;

import uno.Main;
import uno.component.Card;
import uno.component.CardValue;
import uno.component.PlayedCardsList;

/**
 * Implementa le regole del gioco e fornisce di metodi che facilitano
 * la verifica delle mosse a runTime.
 * 
 * Le regole vengono implementate dalla prospettiva della carta giocata. A seconda della carta
 * giocata viene verificato se lo stato delle carte giocate e' compatibile
 *
 */
public class RulesVerifier {

	 private static PlayedCardsList playedCardsList;
	
	/**
	 * 
	 */
	public RulesVerifier(PlayedCardsList playedCardsList) {
	
		RulesVerifier.playedCardsList = playedCardsList;
	}
	

	/**
	 * Verifica che la carta passata come parametro si possa giocare
	 * controllando lo stato delle carte carte giocate.
	 * */
	public boolean checkPlaySoundness(Card playedCard) {
		boolean flag = false;
		
		//carta che si intende giocare 
		CardValue playedCardValue = playedCard.getValue();
		//ultima carta giocata, gia' presente nel mazzo delle carte giocate
		CardValue lastCardPlayedValue = playedCardsList.getLastPlayedCard().getValue();
		
		switch(playedCardValue.getType()){
		
		case CardValue.NO_EFFECT:
			flag = checkNormalCard(playedCardValue, lastCardPlayedValue);
			break;
			
		case CardValue.CHANGE_FLOW:
			flag = checkSpecialCard(playedCardValue, lastCardPlayedValue);
			break;
			
		case CardValue.PLUS_TWO:
			flag = checkSpecialCard(playedCardValue, lastCardPlayedValue);
			break;
		
		case CardValue.ONE_STOP:
			flag = checkSpecialCard(playedCardValue, lastCardPlayedValue);
			break;
			
		default://una carta +4 o una cambia colore si possono giocare sempre
			flag = true;
				
		}
		
		return flag;
		
	}
	
	/**
	 * Verifica che la carta normale si possa giocare
	 * */
	private boolean checkNormalCard(CardValue playedCardValue, CardValue lastPlayedCardValue){

		boolean flag = false;
		if (lastPlayedCardValue.getType() == CardValue.NO_EFFECT){
			//Se il colore e' lo stesso
			if(playedCardValue.getColor().equals(lastPlayedCardValue.getColor()))
				flag = true;
			//se il numero e' lo stesso
			else if(playedCardValue.getNumber() == lastPlayedCardValue.getNumber()) 
				flag = true;
		} else if(lastPlayedCardValue.getType() == CardValue.PLUS_TWO || 
				lastPlayedCardValue.getType() == CardValue.CHANGE_FLOW ||
				lastPlayedCardValue.getType() == CardValue.ONE_STOP) {
			//Se il colore e' lo stesso
			if(playedCardValue.getColor().equals(lastPlayedCardValue.getColor()))
				flag = true;
		} else if(lastPlayedCardValue.getType() == CardValue.PLUS_FOUR ||
				lastPlayedCardValue.getType() == CardValue.CHANGE_COLOR) {
			//se il colore scelto e' lo stesso
			if(playedCardValue.getColor().equals(Main.globalCurrentColor))
				flag = true;
			
		}
		return flag;
	}

	/**
	 * Verifica che una carta +2 o una carta cambia giro si possano giocare. 
	 * */
	private boolean checkSpecialCard(CardValue playedCardValue, CardValue lastPlayedCardValue) {
		boolean flag = false;

		//verifico che la carta scoperta sul tavolo abbia un colore proprio, se ce l'ha controllo che sia lo
		//stesso della carta che si intende giocare
		if(lastPlayedCardValue.getType() == CardValue.PLUS_TWO || 
				lastPlayedCardValue.getType() == CardValue.CHANGE_FLOW ||
				lastPlayedCardValue.getType() == CardValue.NO_EFFECT ||
				lastPlayedCardValue.getType() == CardValue.ONE_STOP) {
			//Se il colore e' lo stesso
			if(playedCardValue.getColor().equals(lastPlayedCardValue.getColor()))
				flag = true;
			//se il tipo e' lo stesso
			else if(playedCardValue.getType() == lastPlayedCardValue.getType())
				flag = true;


		} else if(lastPlayedCardValue.getType() == CardValue.PLUS_FOUR ||
				lastPlayedCardValue.getType() == CardValue.CHANGE_COLOR) {
			//verifica se il colore in gioco e' uguale al colore della carta che si vuol giocare
			if(playedCardValue.getColor().equals(Main.globalCurrentColor))
				flag = true;
			
		}

		return flag;


	}
	
	//DEPRECATO
	//TODO implementare le regole in maniera decente, questa e' solo un abbozzo di una parte delle regole
	/*public boolean checkPlaySoundness(Card card) {
		boolean flag = false;
		
//		
		 * Per ora e' implementata solo la regola che le carte con un proprio colore
		 * possono essere giocate solo se l'ultima carta giocata ha quel colore.
		 * Manca la possibilita' che se la carta ha lo stesso numero e' possibile
		 * giocarla nonostante il colore sia diverso.
		 * 
		 * Non viene considerata la possibilita' di giocare dopo aver giocato un +4 o un cambia colore
		 * 
		 * 
		CardValue lastCardPlayedValue = playedCardsList.getLastPlayedCard().getValue();
		CardValue cardValue = card.getValue();
		
		//se l'ultima carta giocata e' una carta con colore proprio(non e' un cambia colore o un +4)
		if(!lastCardPlayedValue.getColor().equals(CardValue.NO_COLOR)) {
			System.out.println("colore della carta cliccata: " + lastCardPlayedValue.getColor());
			//se la carta che si vuole giocare NON e' un +4 o un cambia colore
			if(cardValue.getType() != CardValue.PLUS_FOUR && cardValue.getType() != CardValue.CHANGE_COLOR) {
				//verifico che il colore sia uguale
				if(cardValue.getColor().equals(lastCardPlayedValue.getColor())) {
					
					//allora la mossa e' valida
					flag = true;
				}
				
			} else {
				//se la carta che si vuole giocare e' un +4 o un cambia colore
				//e' sempre possibile giocarla
				flag = true;
			}
			
		} 
		
		
		return flag;
	}
*/


}
